Repository navigation
feat: Codex voice conversations on web, desktop, and mobile - #13168
jakeleventhal wants to merge 678 commits into
Conversation
ApprovabilityVerdict: Not approved Macroscope's review found this PR not approvable — This PR adds a substantial cross-platform Codex voice workflow with WebRTC, microphone permissions, native entitlements, new server orchestration, and an authenticated streaming RPC. It also changes the default F8 shortcut and adds static-analysis suppressions, so the scope and side effects warrant human review. You can add or adjust custom eligibility rules. Learn more. |
|
Ignore my attempted follow-up review submission; it was not posted. The submitted inline comment on Posted via Macroscope — UI Consistency |
a419382 to
f2bdd9f
Compare
2ace4c3 to
b2614fe
Compare
6ca6a24 to
3e4ca4c
Compare
9fc8676 to
ae065ff
Compare
…gg#13462) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ingdotgg#13467) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…gg#13476) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…#13470) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…g#13471) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…oval (pingdotgg#13486) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…fallback (pingdotgg#13494) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…base (pingdotgg#13502) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…gg#13499) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ingdotgg#13493) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…13509) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
pingdotgg#13505) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ingdotgg#13508) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
6448cfe to
1563a64
Compare
Codex 0.156 voice mode for T3 Code: talk to a realtime voice model that hands work to Codex in the thread and reads its answers back. Audio runs over WebRTC between the client and OpenAI; the server relays only SDP and captions over provider.voice.session, and ending the stream stops the conversation. On orchestrator V2, Codex's self-started voice turns are interrupted and resubmitted as ordinary user runs, since V2 has no provider-initiated runs. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Resubmit a Codex-started voice turn only once it reports interrupted, so a turn that finished before the interrupt landed never runs twice. - Carry each pending resubmit's own provider thread, and keep a replaced voice stream from clearing its successor's thread. - Mobile: gate voice on the provider thread existing, keep the voice strip reachable while a question card hides the composer, and keep a newer conversation's wake lock. - Drop unused exports flagged by knip and update the Codex settings fields test. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…versation - Resubmit a Codex-started voice turn that failed, not only one that was interrupted, so the spoken request is never silently dropped. - /voice stops an active conversation even if the provider no longer reports voice support. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
46603d5 to
9d8c964
Compare
…ional shortcut Startup default sync only treated identical `when` strings as conflicts, so a default like `f8 voice.toggle when !terminalFocus` was appended after a user's bare `f8` binding and won whenever the terminal lacked focus. A default is now skipped when its shortcut matches a user rule and either side is unconditional. Also corrects the voice lifecycle comment: screens pushed over the thread keep a conversation running. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
fe4f6ad to
87c67bd
Compare
|
Note This comment is posted by Julius' dot Closing under the prior-approval rule. This adds a new per-thread live voice workflow across web, desktop, and mobile, including voice-to-Codex handoffs. The recordings and focused checks demonstrate the proposal, but no maintainer approval of its direction and scope is linked. Please agree on that scope with maintainers, link their approval here, and request reconsideration. |
Screen.Recording.2026-09-22.at.8.13.50.PM.mov
ScreenRecording_09-22-2026.20-15-53_1.MP4
Codex 0.156 shipped voice conversations: you talk to a realtime voice model, it hands coding work to Codex in the thread, and it reads Codex's answer back. T3 Code had no way to do this.
How it works
oai-eventsdata channel), and audio flows directly between the client and OpenAI. The newprovider.voice.sessionstream RPC carries only the SDP handshake, captions, and lifecycle, so voice costs the same locally, over a relay, or through a tunnel.CodexVoice.ts,CodexAdapterV2). Startsthread/realtime/startwith the same V3 WebRTC, client-managed-handoff settings the Codex TUI uses. When a voice turn finishes, its final answer goes back throughthread/realtime/appendSpeech; commentary and reasoning are never spoken.voicecontinuation. The request then runs as an ordinary user message. The tradeoff: Codex's own history keeps a stub of the interrupted turn. First-class provider-initiated runs would remove this.VoiceModeControllerinclient-runtimehandles negotiation, mute, captions, mic/speaker levels, the connect timeout, and teardown. Browsers and react-native-webrtc share the same structural peer API./voice, F8 (voice.toggle), an unboundvoice.toggleMute, command palette actions, and a voice strip with status, meters, mute/stop, and live captions. Captions are ephemeral.NSMicrophoneUsageDescriptionand the audio-input entitlement.react-native-webrtc(native rebuild required), AndroidRECORD_AUDIO, loudspeaker routing, and the same button and strip. Conversations stop on background or when leaving the thread.ServerProvider.supportsVoice) and needs a thread whose provider session is running.Verification
🤖 Generated with Claude Code (Claude Opus 5.5, running in T3 Code)